package com.gobang.common.config;

import com.gobang.common.interceptor.WebSocketAuthInterceptor;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

/**
 * WebSocket配置类
 * 配置STOMP消息代理和WebSocket认证拦截器
 * 
 * @author System
 * @since 1.0.0
 */
@Configuration
@EnableWebSocketMessageBroker //启动WS消息代理，支持使用STOMP协议处理消息
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    private final WebSocketAuthInterceptor webSocketAuthInterceptor;

    /**
     * 配置消息代理
     * 设置消息订阅和发布的前缀路径
     *
     * @param config 消息代理注册器
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        // 启用简单的消息代理，用于向客户端发送消息
        config.enableSimpleBroker("/topic", "/queue");
        
        // 设置客户端发送消息的目标前缀
        // /app/move --> @MessageMapping("/move")
        config.setApplicationDestinationPrefixes("/app");
        
        // 设置点对点消息的用户目标前缀
        config.setUserDestinationPrefix("/user");
    }

    /**
     * 注册STOMP端点
     * 配置WebSocket连接端点和跨域设置
     *
     * @param registry STOMP端点注册器
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 注册WebSocket端点（兼容性更好）
        registry.addEndpoint("/websocket/gobang")
                .setAllowedOriginPatterns("*") // 允许跨域连接
                .withSockJS(); // 启用SockJS支持

        // 注册纯WebSocket端点（不使用SockJS）
        registry.addEndpoint("/websocket/gobang-native")
                .setAllowedOriginPatterns("*");
    }

    /**
     * 配置客户端入站通道
     * 添加WebSocket认证拦截器
     *
     * @param registration 通道注册器
     */
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        // 添加WebSocket认证拦截器
        // 介入时机：建立连接时，验证用户身份
        registration.interceptors(webSocketAuthInterceptor);
    }

    /**
     * 配置客户端出站通道
     * 可以添加出站消息拦截器
     *
     * @param registration 通道注册器
     */
    @Override
    public void configureClientOutboundChannel(ChannelRegistration registration) {
        // 暂时不添加出站拦截器
        // 可以在此添加消息发送前的处理逻辑
    }
} 